# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/11 14:01 
@Author  : ZhangShenao 
@File    : iterable.py 
@Desc    : Iterable可迭代对象与Iterator迭代器

所有的容器都是Iterable可迭代的,包括list、tuple、set、dict和str

对于Iterable,调用iter()函数,就会返回一个迭代器Iterator

Iterator迭代器本质上就是一个next()方法,调用它,要么返回下一个元素,要么抛出StopIteration异常

for-in语句本质上就是语法糖,它封装了迭代器的迭代过程

"""


def is_iterable(obj) -> bool:
    """判断一个对象是否为可迭代的"""

    # 尝试通过iter()函数,获取对象的迭代器
    # 如果可以成功获取,则说明对象是可迭代的
    # 否则会抛出TypeError,则说明对象不可迭代
    try:
        iter(obj)
        return True
    except TypeError:
        return False


# 下面所有对象中,除了int,其余对象都是可迭代的
# type of <class 'int'> is Iterable? False
# type of <class 'str'> is Iterable? True
# type of <class 'list'> is Iterable? True
# type of <class 'set'> is Iterable? True
# type of <class 'dict'> is Iterable? True
# type of <class 'tuple'> is Iterable? True

objs = [
    1234,
    '1234',
    [1, 2, 3, 4],
    set([1, 2, 3, 4]),
    {1: 1, 2: 2, 3: 3, 4: 4},
    (1, 2, 3, 4)
]
for obj in objs:
    print(f'type of {type(obj)} is Iterable? {is_iterable(obj)}')
